package com.mall.service;

import com.mall.common.PageResult;
import com.mall.dto.ProductQueryDTO;
import com.mall.entity.Product;
import com.mall.vo.ProductVO;

import java.util.List;

/**
 * 商品服务接口
 * 
 * @author Mall Team
 */
public interface ProductService {
    
    /**
     * 分页查询商品列表
     */
    PageResult<ProductVO.ProductListVO> getProductPage(ProductQueryDTO queryDTO);
    
    /**
     * 根据ID获取商品详情
     */
    ProductVO.ProductDetailVO getProductDetail(Long productId);
    
    /**
     * 搜索商品
     */
    PageResult<ProductVO.ProductListVO> searchProducts(String keyword, Integer pageNum, Integer pageSize);
    
    /**
     * 根据分类获取商品
     */
    PageResult<ProductVO.ProductListVO> getProductsByCategory(Long categoryId, Integer pageNum, Integer pageSize);
    
    /**
     * 获取推荐商品
     */
    List<ProductVO.ProductListVO> getRecommendProducts(Integer limit);
    
    /**
     * 获取热销商品
     */
    List<ProductVO.ProductListVO> getHotProducts(Integer limit);
    
    /**
     * 获取相关商品
     */
    List<ProductVO.ProductListVO> getRelatedProducts(Long categoryId, Long excludeId, Integer limit);
    
    /**
     * 创建商品（管理员功能）
     */
    void createProduct(Product product);
    
    /**
     * 更新商品（管理员功能）
     */
    void updateProduct(Product product);
    
    /**
     * 删除商品（管理员功能）
     */
    void deleteProduct(Long productId);
    
    /**
     * 批量删除商品（管理员功能）
     */
    void deleteProducts(Long[] productIds);
    
    /**
     * 更新商品状态（管理员功能）
     */
    void updateProductStatus(Long productId, Integer status);
    
    /**
     * 更新商品库存
     */
    void updateProductStock(Long productId, Integer stock);

    // 管理端：分页获取商品列表（简化版，返回VO列表）
    List<ProductVO> listProducts(Integer pageNum, Integer pageSize, String keyword);

    // 管理端：新增商品
    void addProduct(Product product);

    // 管理端：根据ID获取商品VO
    ProductVO getProductVOById(Long id);
    
    /**
     * 扣减库存
     */
    boolean reduceStock(Long productId, Integer quantity);
    
    /**
     * 批量扣减库存
     */
    boolean batchReduceStock(List<Product> products);
    
    /**
     * 检查商品名称是否存在
     */
    boolean existsByName(String name);
    
    /**
     * 根据ID获取商品（内部使用）
     */
    Product getProductById(Long productId);
    
    /**
     * 批量获取商品
     */
    List<Product> getProductsByIds(List<Long> productIds);
}